home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
dviware
/
dvipj
/
dvipj.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-08
|
13KB
|
410 lines
/* -*-C-*- dvipj.c */
/*-->dvijet*/
/**********************************************************************/
/******************************* dvipj ********************************/
/**********************************************************************/
/* HP PaintJet driver based on dvijet (the escape sequences are very */
/* similar), magnification stuff from dvitos (also 180 dpi) */
/* The changes to the included files have *only* been made for */
/* unsegmented-memory un*x */
/* We allow 4 colours (including black, but not including white)
(NPLANES =4), stored as 4 separate bitmaps. The current bitmap is
indexed by global variable `plane', which can be reset by \specials. To
make things simpler, the paintjet palette is redefined so that
when only one bitmap has a pixel set at the appropriate position
you get the right colour. At present, if more then one bitmap has
a given pixel set, you get a colour determined by the sequence
red, green, blue, black (in order of increasing precedence). This
should be changed by removing corresponding entries in the other
bitmaps when the current colour is painted.
There is one \special{color <red|blue|green|black>}.
Transparency mode is assumed -- this should be a command-line
switch.
*/
#include "dvihead.h"
/**********************************************************************/
/************************ Device Definitions ************************/
/**********************************************************************/
/* All output-device-specific definitions go here. This section must
be changed when modifying a dvi driver for use on a new device */
#undef HPPAINTJET
#define HPPAINTJET 1 /* conditional compilation flag */
#define VERSION_NO "2.10" /* DVI driver version number */
#define DEVICE_ID "Hewlett-Packard PaintJet printer"
/* this string is printed at runtime */
#define OUTFILE_EXT "pj"
#define DEFAULT_RESOLUTION 180 /* default dots/inch on HP PaintJet */
#define BYTE_SIZE 8 /* output file byte size */
#undef STDRES
#define STDRES 0 /* 0 for low-resolution devices */
#define XDPI 180 /* HP Laser Jet horizontal dots/inch */
#define XPSIZE 8 /* horizontal paper size in inches */
#define XSIZE (((XDPI*XPSIZE+2*HOST_WORD_SIZE-1)/\
(2*HOST_WORD_SIZE))*(2*HOST_WORD_SIZE))
/* number of horizontal dots; */
/* MUST BE multiple of */
/* 2*HOST_WORD_SIZE */
#define XWORDS ((XSIZE + HOST_WORD_SIZE - 1)/HOST_WORD_SIZE)
/* number of words in rows */
/* of bitmap array */
#define YDPI 180 /* HP PaintJet vertical dots/inch */
#define YPSIZE 11 /* vertical paper size in inches */
#define YSIZE (YDPI*YPSIZE) /* number of vertical dots */
#define NPLANES 4 /* number of colour planes
(including black) */
/* The printer bit map (must have an even number of columns). */
#define XBIT ((1+2*XWORDS)/2)
#define YBIT YSIZE
#if (IBM_PC_LATTICE | IBM_PC_MICROSOFT | IBM_PC_WIZARD)
#undef SEGMEM
#define SEGMEM 1 /* ( ((long)XBIT * (long)YBIT) > 65536L ) */
#endif
#include "bitmap.h"
#include "main.h"
#include "abortrun.h"
#include "actfact.h"
#include "alldone.h"
#include "chargf.h"
#include "charpk.h"
#include "charpxl.h"
#include "clrbmap.h"
#include "clrrow.h"
#include "dbgopen.h"
/*-->devinit*/
/**********************************************************************/
/****************************** devinit *******************************/
/**********************************************************************/
void
devinit(argc,argv) /* initialize device */
int argc;
char *argv[];
{
(void)getbmap();
OUTF("\033E\033*t%dR",(int)hpres); /* printer reset, resolution */
OUTS("\033&k3W"); /* transparency mode -- should be made */
/* optional */
}
/*-->devterm*/
/**********************************************************************/
/****************************** devterm *******************************/
/**********************************************************************/
void
devterm() /* terminate device */
{
}
#include "dvifile.h"
#include "dviinit.h"
#include "dviterm.h"
#include "dispchar.h"
#include "f20open.h"
#include "fatal.h"
#include "fillrect.h"
#include "findpost.h"
#include "fixpos.h"
#include "fontfile.h"
#include "fontsub.h"
#include "getbmap.h"
#include "getbytes.h"
#include "getfntdf.h"
#include "getpgtab.h"
#include "initglob.h"
#include "inch.h"
#include "loadchar.h"
#include "movedown.h"
#include "moveover.h"
#include "moveto.h"
#include "nosignex.h"
#include "openfont.h"
#include "option.h"
/*-->outline*/
/**********************************************************************/
/****************************** outline *******************************/
/**********************************************************************/
void
outline(type,pbit)
UNSIGN32 *pbit; /* pointer to raster line */
char type; /* 'V' or 'W' for non-last or last */
/* plane respectively */
/*************************************************************************
Use machine-specific coding here for efficiency. For TOPS-20, we encode
9 bytes from every pair of 36-bit words.
For each raster line on the paper, the Laser Jet expects a binary 8-bit
byte stream of the form
<ESC>*bnnnWxxxxxxx ... xxxxxxx
<--- nnn bytes --->
where each byte contains, in order from high to low bit, a left-to-right
bit pattern. No end-of-line marker is required; the escape sequence
automatically causes a new raster line to be started.
*************************************************************************/
{
register UNSIGN32 w_even,w_odd;
register UNSIGN32 *p;
register BYTE *pbuf;
BYTE buf[1+(XSIZE+7)/8]; /* space for EOS + n 8-bit bytes */
register INT16 i,last_word;
#if IBM_PC_MICROSOFT
for (last_word = XBIT - 1;
(last_word >= 1) && (*(UNSIGN32*)normaddr(pbit,last_word) == 0);
--last_word)
; /* trim white space a word at a time */
#else
p = pbit + XBIT - 1; /* point to last word on line */
for (last_word = XBIT - 1; (last_word >= 1) && (*p == 0); --last_word)
--p; /* trim white space a word at a time */
#endif
p = pbit;
pbuf = &buf[0];
for (i = 0; i <= last_word; i += 2) /* loop over trimmed raster */
{
w_even = (*p++);
w_odd = (*p++);
#if (HOST_WORD_SIZE == 36)
*pbuf++ = (BYTE)( (w_even >> 28) & 0xff);
*pbuf++ = (BYTE)( (w_even >> 20) & 0xff);
*pbuf++ = (BYTE)( (w_even >> 12) & 0xff);
*pbuf++ = (BYTE)( (w_even >> 4) & 0xff);
*pbuf++ = (BYTE)( ((w_even << 4) | (w_odd >> 32)) & 0xff);
*pbuf++ = (BYTE)( (w_odd >> 24) & 0xff);
*pbuf++ = (BYTE)( (w_odd >> 16) & 0xff);
*pbuf++ = (BYTE)( (w_odd >> 8) & 0xff);
*pbuf++ = (BYTE)( (w_odd ) & 0xff);
#else /* HOST_WORD_SIZE == 32 */
/* encode 8 bytes at a time on 32-bit machines */
*pbuf++ = (BYTE)( (w_even >> 24) & 0xff);
*pbuf++ = (BYTE)( (w_even >> 16) & 0xff);
*pbuf++ = (BYTE)( (w_even >> 8) & 0xff);
*pbuf++ = (BYTE)( (w_even ) & 0xff);
*pbuf++ = (BYTE)( (w_odd >> 24) & 0xff);
*pbuf++ = (BYTE)( (w_odd >> 16) & 0xff);
*pbuf++ = (BYTE)( (w_odd >> 8) & 0xff);
*pbuf++ = (BYTE)( (w_odd ) & 0xff);
#endif
}
*pbuf = '\0'; /* trailing EOS marker */
last_word |= 1; /* make last_word ODD */
for (i = ((last_word+1)*HOST_WORD_SIZE)/8;
(*(--pbuf) == '\0') && (i > 1); --i)
; /* trim trailing zero bytes, leaving at least one */
last_word = i;
if (type=='V')
OUTF("\033*b%dV",(int)last_word);
else if (type=='W')
OUTF("\033*b%dW",(int)last_word);
pbuf = &buf[0]; /* cannot use fprintf with %s format because of
NUL's in string, and it is slow anyway */
for (i = 0; i < last_word; ++pbuf,++i)
OUTC(*pbuf);
}
/*-->prtbmap*/
/**********************************************************************/
/****************************** prtbmap *******************************/
/**********************************************************************/
void
prtbmap()
{
register UNSIGN32 *p;
register INT16 i,j,k,ybottom,ytop;
if (DBGOPT(DBG_PAGE_DUMP))
{
INT16 k1,k2,k3;
for (k3 = 0; k3 < XBIT; (k3 += 7, ++p))
{ /* print bitmap 7 words at a pass */
k1 = k3;
k2 = MIN(XBIT,k1+7);
(void)printf("prtbmap()...bitmap words %d..%d",k1,k2-1);
NEWLINE(stdout);
(void)printf(" ");
for (k = k1; k < k2; ++k)
(void)printf("%10d",k*HOST_WORD_SIZE);
NEWLINE(stdout);
for (j = YBIT-1; j >= 0; --j)
{
p = BITMAP(plane,j,0);
for (k = 0; k < XBIT; (++k,++p))
{
if (*p) /* print non-blank raster line */
{
p = BITMAP(plane,j,k1);
(void)printf("%5d:",j);
for (k = k1; k < k2; (++k,++p))
(void)printf(" %09lx",*p);
NEWLINE(stdout);
break; /* exit loop over k */
}
}
}
}
}
(void)clearerr(plotfp);
#if ZAPTHISOUT
k = -1; /* find top non-zero raster */
for (j = YBIT-1; (j > 0) && (k < 0); --j) /* loop over raster lines */
{
p = BITMAP(plane,j,XBIT-1);
for (k = XBIT - 1; ((k >= 0) && (*p == 0)); --k)
--p; /* trim white space */
}
ytop = j;
#else
ytop = YBIT-1;
#endif
k = -1; /* find bottom non-zero raster */
for (j = 0; (j < ytop) && (k < 0); ++j) /* loop over raster lines */
{
#if IBM_PC_MICROSOFT
for (k = XBIT - 1;((k >= 0) && (*BITMAP(plane,j,k) == 0));--k)
; /* trim white space */
#else
p = BITMAP(plane,j,XBIT-1);
for (k = XBIT - 1; ((k >= 0) && (*p == 0)); --k)
--p; /* trim white space */
#endif
}
ybottom = MAX(0,j-1);
#if ZAPTHISOUT
for (j = ytop; (j >= ybottom); --j)
{
OUTF("%5d:",(int)j);
for (k = 0; k < XBIT; ++k)
OUTF(" %9x",*BITMAP(plane,j,k));
NEWLINE(plotfp);
}
#endif
/* OUTF("\033&l%dX",(int)copies); *//* number of copies (not relevant)*/
OUTS("\033*r4U"); /* use 4 printer colour planes */
/* (distinct from bitmap */
/* plane) */
OUTS("\033*v90A\033*v88B\033*v85C\033*v0I"); /* define palette # 0 as white */
OUTS("\033*v53A\033*v8B\033*v14C\033*v1I"); /* define palette # 1 */
/* as red */
OUTS("\033*v3A\033*v26B\033*v22C\033*v2I"); /* define palette # 2 */
/* as green */
OUTS("\033*v3I"); /* and #3 */
OUTS("\033*v4A\033*v4B\033*v29C\033*v4I"); /* define palette # 4 */
/* as blue */
OUTS("\033*v5I\033*v6I\033*v7I"); /* and #5,6,7 */
OUTS("\033*v4A\033*v4B\033*v6C\033*v8I"); /* define palette # 8 */
/* as black */
OUTS("\033*v9I\033*v10I\033*v11I\033*v12I\033*v13I\033*v14I\033*v15I");
/* and other values with top bit set (i.e., including black) */
OUTS("\033*r1A"); /* start plot at current */
/* position */
for (j = ytop; (j >= ybottom) ; --j) { /* loop over raster lines */
for (i = 1; i<=3; i++)
outline('V',BITMAP(i,j,0)); /* red, green, blue in order */
outline('W',BITMAP(0,j,0)); /* finish with black */
}
/* OUTS("\033*rB"); */ /* end raster graphics */
OUTS("\f"); /* get to bottom of page */
(void)fflush(plotfp);
if (DISKFULL(plotfp))
(void)fatal("Output error -- disk storage probably full");
}
#include "outrow.h"
#include "prtpage.h"
#include "readfont.h"
#include "readgf.h"
#include "readpk.h"
#include "readpost.h"
#include "readpxl.h"
#include "reldfont.h"
#include "rulepxl.h"
#include "setchar.h"
#include "setfntnm.h"
#include "setrule.h"
#include "signex.h"
#include "skgfspec.h"
#include "skipfont.h"
#include "skpkspec.h"
/* -*-C-*- special.h */
/*-->special*/
/**********************************************************************/
/****************************** special *******************************/
/**********************************************************************/
void
special(s) /* process TeX \special{} string in s[] */
register char *s;
{
if (strncmp("color ",s,6)==0) {
if (strcmp("black",&s[6])==0) plane=0;
else if(strcmp("red",&s[6])==0) plane=1;
else if(strcmp("green",&s[6])==0) plane=2;
else if(strcmp("blue",&s[6])==0) plane=3;
else {
(void)sprintf(message,
"special(): colour %s not available -- ignored",s);
(void)warning(message);
}
}
else {
(void)sprintf(message,
"special(): TeX \\special{%s} not implemented in this driver",s);
(void)warning(message);
}
}
#include "strchr.h"
#include "strcm2.h"
#include "strid2.h"
#include "strrchr.h"
#include "tctos.h"
#include "usage.h"
#include "warning.h"